package br.gov.ibama.client.visao.matricula;

import java.util.ArrayList;
import java.util.List;

import br.gov.ibama.client.componentes.BasisComponentes;
import br.gov.ibama.client.componentes.PopUpBasis;
import br.gov.ibama.client.constantes.ConstantesDS;
import br.gov.ibama.client.constantes.ConstantesFields;

import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.rpc.RPCResponse;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.ImgButton;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.fields.ComboBoxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.HiddenItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.grid.CellFormatter;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;

public class VisaoPopupMatricula extends PopUpBasis{

	public VisaoPopupMatricula(String title) {
		super (title);
	}

	public VisaoPopupMatricula (String title, int estado){
		super(title, estado);
	}
	
	protected List<ImgButton> getBotoes (){
		List<ImgButton> listaBotoes = new ArrayList<ImgButton>();
		listaBotoes.add(getBotaoSalvar());
		listaBotoes.add(getBotaoCancelar());
		return listaBotoes;
	}
	
	private ImgButton getBotaoSalvar(){
		ImgButton Salvar = BasisComponentes.criaImgButton("Salvar", "salvar_32x32.png");
		Salvar.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				if(validaCampos()){				
					FormItem aluno = getFormulario().getItem(ConstantesFields.FIELD_ALUNO_ID);
					FormItem disciplina = getFormulario().getItem(ConstantesFields.FIELD_DISCIPLINA_ID);
					Criteria criteria = new Criteria();
					criteria.addCriteria(ConstantesFields.FIELD_ALUNO_ID, aluno.getValue().toString());
					criteria.addCriteria(ConstantesFields.FIELD_DISCIPLINA_ID, disciplina.getValue().toString());
					DataSource.get(ConstantesDS.DS_MATRICULA).fetchData(criteria, new DSCallback() {
						
						@Override
						public void execute(DSResponse response, Object rawData, DSRequest request) {
							if (!response.getDataAsRecordList().isEmpty() &&
									response.getDataAsRecordList().getLength() > 0) {
								SC.warn("O aluno já está matriculado nesta disciplina.");
							} else {
								Record record = formulario.getValuesAsRecord();
								if(getEstado() == PopUpBasis.ESTADO_EDITAR){
									DataSource.get(ConstantesDS.DS_MATRICULA).updateData(record,new CallBackSalvarEditar());
								}	
								else if(getEstado() == PopUpBasis.ESTADO_SALVAR){
									DataSource.get(ConstantesDS.DS_MATRICULA).addData(record,new CallBackSalvarEditar());
									FormItem periodo = formulario.getField(ConstantesFields.FIELD_DISCIPLINA_PERIODO);
									if (periodo != null && periodo.getValue() != null && !periodo.getValue().toString().equals("")) {
										int semestre = Integer.parseInt(periodo.getValue().toString());
										if (semestre == 1) {
											// Cadastra 6 frequencias do 1º semestre
											for(int i=1; i<=6; i++) {
												record.setAttribute(ConstantesFields.FIELD_FREQUENCIA_MES, i);
												DataSource.get(ConstantesDS.DS_FREQUENCIA).addData(record,new CallBackSalvarEditar());
											}
										} else {
											// Cadastra 6 frequencias do 2º semestre
											for(int i=7; i<=12; i++) {
												record.setAttribute(ConstantesFields.FIELD_FREQUENCIA_MES, i);
												DataSource.get(ConstantesDS.DS_FREQUENCIA).addData(record,new CallBackSalvarEditar());
											}
										}
									} else {
										// Cadastra as frequencias do ano
										for(int i=1; i<=12; i++) {
											record.setAttribute(ConstantesFields.FIELD_FREQUENCIA_MES, i);
											DataSource.get(ConstantesDS.DS_FREQUENCIA).addData(record,new CallBackSalvarEditar());
										}
									}
									//Cadastra as campos da notas do aluno
									record = formulario.getValuesAsRecord();
									DataSource.get(ConstantesDS.DS_NOTA).addData(record,new CallBackSalvarEditar());
								}
							}							
						}
					});
				}
			}
		});
		return Salvar;
	}
	
	private ImgButton getBotaoCancelar(){
		ImgButton Cancelar = BasisComponentes.criaImgButton("Cancelar", "cancelar_32x32.png");
		Cancelar.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				destroy();
				
			}
		});
		return Cancelar;
	}
	
	public void criaFormulario(){
		preparaFormulario(ConstantesDS.DS_MATRICULA, getListaCamposFormulario());
			}
	public FormItem[] getListaCamposFormulario(){
		return getCamposFormulario().toArray(new FormItem[getCamposFormulario().size()]);
	}
	
	private List<FormItem> getCamposFormulario(){
		List<FormItem> listaCampos = new ArrayList<FormItem>();
	
		TextItem codigoMatricula = BasisComponentes.criaTextItemPequeno(ConstantesFields.FIELD_MATRICULA_ID);
		codigoMatricula.setCanEdit(false);
		listaCampos.add(codigoMatricula);
		
		TextItem aluno = BasisComponentes.criaComboboxObrigatorioGrande(ConstantesFields.FIELD_ALUNO_ID, "Aluno");
		aluno.setOptionDataSource(DataSource.get(ConstantesDS.DS_ALUNO));
		aluno.setDisplayField(ConstantesFields.FIELD_ALUNO_NOME);
		aluno.setValueField(ConstantesFields.FIELD_ALUNO_ID);
		listaCampos.add(aluno);
		
		HiddenItem periodo = new HiddenItem(ConstantesFields.FIELD_DISCIPLINA_PERIODO);
					
		ComboBoxItem disciplina_turma = BasisComponentes.criaComboboxObrigatorioGrande(ConstantesFields.FIELD_DISCIPLINA_ID, "Disciplina"); 
		disciplina_turma.setOptionDataSource(DataSource.get(ConstantesDS.DS_DISCIPLINA));  
		ListGrid pickListProperties = new ListGrid();  
        pickListProperties.setCellFormatter(new CellFormatter() {  
            @Override  
            public String format(Object value, ListGridRecord record, int rowNum, int colNum) {  
                String turma = record.getAttribute(ConstantesFields.FIELD_DISCIPLINA_TURMA);  
                String disciplina = record.getAttribute(ConstantesFields.FIELD_DISCIPLINA_NOME);
                String idDisciplina = record.getAttribute(ConstantesFields.FIELD_DISCIPLINA_ID);  
                return idDisciplina + " - " + disciplina + " - " + turma; 
            }  
        });  
        disciplina_turma.setPickListProperties(pickListProperties);
        
        disciplina_turma.addChangedHandler(new ChangedHandler() { 
            public void onChanged(ChangedEvent event) {  
            	getFormulario().clearValue(ConstantesFields.FIELD_DISCIPLINA_PERIODO);
            	Integer selectedItem = (Integer) event.getValue(); 
				Criteria criteria = new Criteria();
				criteria.addCriteria(ConstantesFields.FIELD_DISCIPLINA_ID, selectedItem.toString());
				DataSource.get(ConstantesDS.DS_DISCIPLINA).fetchData(criteria, new DSCallback() {
					
					@Override
					public void execute(DSResponse response, Object rawData, DSRequest request) {
						if (!response.getDataAsRecordList().isEmpty() && response.getDataAsRecordList().getLength() > 0) {
							Record[] registros = response.getData();
							Record registro = registros[0];
							String periodo = registro.getAttribute(ConstantesFields.FIELD_DISCIPLINA_PERIODO);
							getFormulario().getField(ConstantesFields.FIELD_DISCIPLINA_PERIODO).setValue(periodo);
						}					
					}
				});                
            }  
        });  
        
        listaCampos.add(disciplina_turma);
        listaCampos.add(periodo);
        
		return listaCampos;
		
	}
	
	private final class CallBackSalvarEditar implements DSCallback {
		@Override
		public void execute(DSResponse response, Object rawData, DSRequest request) {
			if (RPCResponse.STATUS_SUCCESS == response.getStatus()) {
				if(getEstado() == PopUpBasis.ESTADO_SALVAR){
					SC.say("Incluído com sucesso");
					destroy();
				}
				else if(getEstado() == PopUpBasis.ESTADO_EDITAR){
					SC.say("Alterado com sucesso");
					destroy();
				}				
			} else if (RPCResponse.STATUS_VALIDATION_ERROR == response.getStatus()) {
				formulario.setErrors(response.getErrors(), true);
				SC.say("Existem erros de validação, por favor verificar os dados informados.");
			} else if (RPCResponse.STATUS_FAILURE == response.getStatus()) {
				SC.say("Falha ao executar a operação.");
			}
		}
	}
	
	private boolean validaCampos() {
		FormItem disciplina = getFormulario().getItem(ConstantesFields.FIELD_DISCIPLINA_ID);
		FormItem aluno = getFormulario().getItem(ConstantesFields.FIELD_ALUNO_ID);

		// Verifica preenchimento dos campos obrigatórios
		if (isVazio(disciplina) || isVazio(aluno)) {
			SC.warn("Há campos obrigatórios não preenchidos.");
			return false;
		}

		return true;
	}

}
